iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 4
0
Software Development

每天 Racket 3 分鐘系列 第 12

(hash 'day-11 "為你的資料命名 — Racket 的 Hash")

  • 分享至 

  • xImage
  •  

1. 世界上最難的事

曾經有人統計過,一個 Programmer 工作中,佔比最重的事情是什麼,為變數取名字佔了 50%!取名字真的是一見開發過程中最難的事情。而如果一次要取大量的資料名稱呢?

Racket 當然也支援主流語言常見的 HashTable 型態,如果各位有寫過像 Scala 或一些具有 FP 特性的語言,在碰到這類的資料結構時,大概會有一個直覺反應:這是可變的(mutable),還是不可變的(immutable)?

不管是 List、Pair、Vector、HashTable,在 FP 語言裡,大多是建議你用不可變的機制來操作,因此我們先介紹不可變的 HashTable:

(define h (hash 'a "apple" 'g "grape"))
(hash-ref h 'a)  ;; "apple"

在 Racket 語言裡,對資料結構進行存取,都會預設有一個 -ref 函式,不管是在 List、Vector,當然 Pair 這類簡單的結構例外。因此 hash-ref 是存取 HashTable 的,vector-ref 是存取 Vector 的。而 hash 函式,如同 vectorlist 一樣,透過它可以建立一個不可變的資料結構。因為 HashTable 是一種 Key-Value pair 的結構,hash 後頭的參數必須是偶數個,以 key1 value1 key2 value2 ... 這樣的規則排列。

而若是要建立可變的 HashTable,還記得 Vector 有個 make-vector 嗎?HashTable 也有個 make-hash

(define h2 (make-hash))
(hash-set! h2 'a "apple")
(hash-set! h2 'g "graple")
(hash-ref h2 'a)  ;; "apple"

然而,進一步的資料操作可以參考 Racket Guide [1]


上一篇
(lambda (day-10?) (if (day-10?) "媽!我的程式跑不停!— 遞迴與尾遞迴 (tail-recursion)" (void)))
下一篇
(struct iron-man (day title)) (define today (iron-man 'day-12 "Racket 的資料抽象 — Struct"))
系列文
每天 Racket 3 分鐘17
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言